package im.oen.boot.api.dao;

import im.oen.boot.api.entity.AbsEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author Kevin.Xu
 */
@NoRepositoryBean
public interface AbsDao<T extends AbsEntity, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    /**
     * 根据数据的UUID查询数据
     *
     * @param uuid UUID
     * @return 数据
     */
    public T findByUuid(String uuid);

    /**
     * 根据创建时间统计数据
     *
     * @param start 开始时间
     * @param end   结束时间
     * @return 数据量
     */
    @Query("select count(*) from #{#entityName} t where t.created > ?1 and t.created <= ?2")
    public Long countByCreated(long start, long end);

    /**
     * 通过创建时间统计每天的数据量
     *
     * @param start 开始时间
     * @param end   结束时间
     * @return 每天的数据量
     */
    @Query("select new map(t.createdFmt as item,count(*) as value) from #{#entityName} t where t.created > ?1 and t.created <= ?2 group by t.createdFmt")
    public List<Map<String, Long>> groupDateByCreated(long start, long end);
}
